﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;


namespace App_Persistencia
{
    public class Mesa_Data
    {

        int nro;
        
        public int Nro
        {
            get { return nro; }
            set { nro = value; }
        }
        
        List<Invitado_Data> invitadoList;

        public List<Invitado_Data> InvitadoList
        {
            get { return invitadoList; }
            set { invitadoList = value; }
        }

        public void crearMesasEvento(int idEvento, int cantMesas)
        {

            // Crear el Objeto de conexion, inicializa con la cadena de conexion
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            System.Data.SqlClient.SqlConnection connection = new SqlConnection(conexion);

            // Abro la conexion
            connection.Open();

            //Invoco al Objeto SqlTransaction para manejar la transaccion  
            //ejecuto la transaccion
            SqlTransaction transaccion = connection.BeginTransaction();


            try
            {

                // Creo el Objeto Command, le asigno la conexion y el Procediminto a utilizar
                System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand();
                //Asigno a la propiedad Transaction del Objeto SqlCommand el valor del Objeto SqlTransaction
                command.Transaction = transaccion;
                //Asingo la conexion al objeto conection
                command.Connection = connection;
                command.CommandText = "spCargarMesa";
                command.CommandType = CommandType.StoredProcedure;

                // Declaro el Objeto de parametro
                System.Data.SqlClient.SqlParameter param;

                for (int i = 0; i < cantMesas; i++)
                {
                    command.Parameters.Clear();
                    // Establesco el parametro @SocDirDepto
                    param = command.Parameters.AddWithValue("@Numero", i + 1);
                    param.DbType = DbType.Int32;
                    param.Direction = ParameterDirection.Input;

                    // Establesco el parametro @SocDenom, uso como entrada los atributos de la clase
                    param = command.Parameters.AddWithValue("@EventoId", idEvento);
                    param.DbType = DbType.Int32;
                    param.Direction = ParameterDirection.Input;

                    // Establesco el parametro @SocDenom, uso como entrada los atributos de la clase
                    param = command.Parameters.AddWithValue("@DiseñoMesaId", 1);
                    param.DbType = DbType.Int32;
                    param.Direction = ParameterDirection.Input;

                    param = command.Parameters.AddWithValue("@MesaId", 0);
                    param.DbType = DbType.Int32;
                    param.Direction = ParameterDirection.Input;

                    // Ejecuto el procedimiento
                    command.ExecuteNonQuery();

                    nro = Convert.ToInt32(command.Parameters["@MesaId"].Value);

                }

                //Si no se genero ningun error en la carga ejecuto el commit
                transaccion.Commit();
            }
            catch (SystemException e)
            {
                //si se produjo algun error lo capturo y ejecuto el Rollback de la transaccion
                transaccion.Rollback();
                //provoco una Exepcion para la capa superior
                System.Diagnostics.Trace.Write(e.Message);

                throw new SystemException(e.Message);
            }
            finally
            {
                //Si termino la carga correctamente cierro la conexion
                connection.Close();
            }
        }

        public DataTable mesaxEvento(Evento_Data evento)
        {
            //Creo la sentencia SQL
            string commandSQL = "SELECT        mesa_Numero AS Nro, mesa_Id as Id " +
                                "FROM            Mesa " +
                                "WHERE        (evento_Id = " + evento.Id + ")";

            // Creo el Objeto DataAdapter y le paso la cadena al constructor y la sentencia SQL
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            SqlDataAdapter dataAdapter = new SqlDataAdapter(commandSQL, conexion);

            // Creo el Objeto DataSet
            DataSet dataSet = new DataSet();

            // Relleno el Objeto DataSet
            dataAdapter.Fill(dataSet, "Mesas");

            //creo la vista de la consulta
            DataView dataView = new DataView();

            //Cargo la Vista con el contenido de la tabla de resultados
            dataView = dataSet.Tables["Mesas"].DefaultView;

            // Obtengo la tabla del DataSet
            DataTable dataTable = dataSet.Tables["Mesas"];

            return dataTable;
        }

        public void guardarMesa(int EventoId)
        {
            // Crear el Objeto de conexion, inicializa con la cadena de conexion
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            System.Data.SqlClient.SqlConnection connection = new SqlConnection(conexion);

            // Abro la conexion
            connection.Open();

            //Invoco al Objeto SqlTransaction para manejar la transaccion  
            //ejecuto la transaccion
            SqlTransaction transaccion = connection.BeginTransaction();

            try
            {

                cargarDetalleInvitados(transaccion, connection, EventoId);

                //Si no se genero ningun error en la carga ejecuto el commit
                transaccion.Commit();
            }
            catch (SystemException e)
            {
                //si se produjo algun error lo capturo y ejecuto el Rollback de la transaccion
                transaccion.Rollback();
                //provoco una Exepcion para la capa superior
                System.Diagnostics.Trace.Write(e.Message);

                throw new SystemException(e.Message);
            }
            finally
            {
                //Si termino la carga correctamente cierro la conexion
                connection.Close();
            }


        }

        public void cargarDetalleInvitados(SqlTransaction pTransaccion, SqlConnection pConnection, int EventoId)
        {
            for (int i = 0; i < invitadoList.Count; i++)
            {
                // Creo el Objeto Command, le asigno la conexion y el Procediminto a utilizar
                System.Data.SqlClient.SqlCommand commandDetalle = new System.Data.SqlClient.SqlCommand();
                //Asigno a la propiedad Transaction del Objeto SqlCommand el valor del Objeto SqlTransaction
                commandDetalle.Transaction = pTransaccion;
                //Asingo la conexion al objeto conection
                commandDetalle.Connection = pConnection;
                commandDetalle.CommandText = "spCargarInvitadoxMesa";
                commandDetalle.CommandType = CommandType.StoredProcedure;

                // Declaro el Objeto de parametro
                System.Data.SqlClient.SqlParameter paramDetalle;

                // Establesco el parametro @EjeId, uso como entrada los atributos de la clase
                paramDetalle = commandDetalle.Parameters.AddWithValue("@Apellido", invitadoList[i].Apellido);
                paramDetalle.DbType = DbType.String;
                paramDetalle.Direction = ParameterDirection.Input;

                // Establesco el parametro @EjeId, uso como entrada los atributos de la clase
                paramDetalle = commandDetalle.Parameters.AddWithValue("@Nombre", invitadoList[i].Nombre);
                paramDetalle.DbType = DbType.String;
                paramDetalle.Direction = ParameterDirection.Input;

                // Establesco el parametro @EjeId, uso como entrada los atributos de la clase
                paramDetalle = commandDetalle.Parameters.AddWithValue("@DNI", invitadoList[i].Dni);
                paramDetalle.DbType = DbType.Int32;
                paramDetalle.Direction = ParameterDirection.Input;

                // Establesco el parametro @SocDenom, uso como entrada los atributos de la clase
                paramDetalle = commandDetalle.Parameters.AddWithValue("@MesaId", nro);
                paramDetalle.DbType = DbType.Int32;
                paramDetalle.Direction = ParameterDirection.Input;

                // Establesco el parametro @SocDenom, uso como entrada los atributos de la clase
                paramDetalle = commandDetalle.Parameters.AddWithValue("@EventoId", EventoId);
                paramDetalle.DbType = DbType.Int32;
                paramDetalle.Direction = ParameterDirection.Input;

                // Establesco el parametro @EjeId, uso como entrada los atributos de la clase
                paramDetalle = commandDetalle.Parameters.AddWithValue("@MenuId", invitadoList[i].Menu.Id);
                paramDetalle.DbType = DbType.Int32;
                paramDetalle.Direction = ParameterDirection.Input;

             

                // Ejecuto el procedimiento
                commandDetalle.ExecuteNonQuery();

            }
        }
               

    }
}
